//#include<bits/stdc++.h>
//using namespace std;
//int n,m;
//set<int>e[100009];
//bool vis[100009];
//void init(){
//	for(scanf("%d%d",&n,&m);m;--m){
//		int u=0,v=0;
//		scanf("%d%d",&u,&v);
//		e[u].insert(v);
//	}
//}
//void dfs(int x=1){
//	if(vis[x])return;vis[x]=1;
//	printf("%d ",x);
//	for(int v:e[x])dfs(v);
//}
//void bfs(){
//	queue<int>q;
//	q.push(1);
//	while(!q.empty()){
//		int x=q.front();q.pop();
//		if(vis[x])continue;vis[x]=1;
//		printf("%d ",x);
//		for(int v:e[x])q.push(v);
//	}
//}
//int main(){
//	init();
//	dfs();
//	putchar('\n');
//	memset(vis,0,sizeof(vis));
//	bfs();
//	putchar('\n');
//	return 0;
//}


#include<bits/stdc++.h>
using namespace std;

int n,m;
bool visit[100005];
set<int> edges[100005];

void dfs(int s){
	if(visit[s]) return;
	visit[s]=true;
	cout<<s<<' ';
	for(auto i:edges[s]){
		dfs(i);	
	}
	return;
}

int main(){
	cin>>n>>m;
	int s,t;
	for(int i=0;i<m;i++){
		cin>>s>>t;
		edges[s].insert(t);
	}
	memset(visit,false,sizeof(visit));
	for(int i=1;i<=n;i++){
		if(!visit[i]) dfs(i);
	}
	cout<<endl;
	//bfs();
	memset(visit,false,sizeof(visit));
	queue<int> que;
	for(int i=1;i<=n;i++){
		if(!visit[i]){
			que.push(i);
			visit[i]=true;
			while(!que.empty()){
				int s=que.front();
				que.pop();
				cout<<s<<' ';
				for(auto& j:edges[s]){
					if(!visit[j]){
						que.push(j);
						visit[j]=true;
					}
				};
			}
		}
	}
	return 0;
}
